
const executor = function(resolve, reject){
    if( Math.random() > 0.5 ) {
        resolve('肯定');
    } else {
        reject('否定');
    }
}

const p1 = new Promise( executor );
console.log( 'p1: ', p1 );

const onResolved = function(value) {
    console.log( 'resolved: ', value );
}

const onRejected = function( value ) {
    console.log( 'rejected: ', value );
}

const ending = function() {
    console.log('finally');
}

// 1、不论 p1 是 被肯定的 还是 被否定的，函数 then 都是要执行的，并且返回了新的 Promise实例
// 2、在 then 内部会根据 p1 的状态来确定调用 onResolved 还是调用 onRejected
// 3、不论是那种状态，在 then 内部都只会调用 onResolved 或 onRejected 其中一个函数
// const p2 = p1.then( onResolved, onRejected );

// 1、不论 p1 是 被肯定的 还是 被否定的， 函数 then 都是要执行的，而且返回了新的 Promise实例
// 2、若 p1 是 被肯定的 则调用 onResolved 函数
// 3、若 p1 是 被否定的 则什么也不做(因为没有传第二个参数)，后续操作交给 p2 继续处理
const p2 = p1.then( onResolved );
console.log( 'p2: ', p2 );

// 1、不论 p2 是 被肯定的 还是 被否定的， 函数 catch 都是要执行的，而且返回了新的 Promise实例
// 2、若 p2 是 被否定的 则调用 onRejected，否则什么也不做 (若还有后续操作则交给 p3 处理 )
const p3 = p2.catch( onRejected );
console.log( 'p3: ', p3 );

// 1、不论是那种状态，函数 finally 总是要执行的并且返回了新的 Promise实例
// 2、不论是那种状态，函数 finally 内部总是要调用 它的参数对应的函数
const p4 = p3.finally( ending );
console.log( 'p4: ', p4 );